# -*- coding: utf-8 -*-
# 测试类内部的测试方法：setup_method
# 模块下的测试函数：setup_function
import pytest
from selenium import webdriver
# 没有设置scope，默认为测试函数级别。即调用此fixture的测试类/模块/函数下，每个测试函数都会执行一次这个fixture
# 设置scope为class。调用此fixture的测试类下，只执行一次这个fixture
#fixture 有 4 个作用域：测试会话(session)、测试模块(module)、测试类(class)、测试用例(function)
#定义fixture，在这里可以定义多个fixture,conftest.py 在哪个目录下，此目录下(包含子目录)的所有用例可使用其中的 fixture。
# 嵌套使用即：一个 fixture，可以做另外一个 fixture 的参数。
@pytest.fixture
def start():
    pass
    yield
    pass
# 案例2
#需求：当我们需要多次调用同一个fixture 时，要在 Google、Firefox 浏览器下执行测试用例，用例为打开百度搜索 pytest。
# 定义的fixture参数化，调用它的方法会执行两遍，一遍谷歌，一遍火狐，params设置为google和firefox
@pytest.fixture(params=["google", "firefox"])
def browser_fix(request):
    if request.param == "google":
        driver = webdriver.Chrome()
    elif request.param == "firefox":
        driver = webdriver.Firefox()
    else:
        driver = None
    yield driver
    if driver:
        driver.quit()
# 案例3
'''当我们在一个用例当中，需要多次调用 fixture 时，就可以使用 fixture 工厂
利用的是装饰器的方式
在 fixture 内部，定义一个函数。fixture 返回的是函数。'''
#---------------------------------------
@pytest.fixture
def make_customer_record():
    def _make_customer_record(name):
        return {"name": name, "orders": []}

    return _make_customer_record

# 用例内部，多次调用了fixture.
def test_customer_records(make_customer_record):
    customer_1 = make_customer_record("Lisa")  # 第1次调用
    customer_2 = make_customer_record("Mike")  # 第2次调用
    customer_3 = make_customer_record("Meredith")  # 第3次调用
#-----------------------------------------------------------

# 案例4
# request其实是fixture,可以通过request作为定义fixture的参数来获取fixture的相关信息
@pytest.fixture(params=[1, 2])
def init(request):
    print("用例名称：", request.function)#谁调用这个fixture(init),那么就会输出这些信息（request.function、request.param），这些方法是系统自定义的
    print("fix参数 ", request.param)
    print("fix的作用域 ", request.scope)
    print("用例所在的类 ", request.cls)

'''案例5
一般 function、class、module 级别的 fixture，都不会去开启 autouse=True
如果定义fixture的时候设置autouse=True，即会自动调用
测试用例文件(test_autouse1.py，test_autouse2.py)当中，并没有使用，如果设置了autouse=True就会自动调用'''






'''
调用fixture
在以上 2 点都定下来了之后，接下来就是，在测试用例当中，根据需要调用不同的 fixture。
调用方法有 2 种：
1、在测试用例/测试类上面加上：@pytest.mark.usefixture("fixture 的函数名字")，通过这个调用不传参调用能否解决po模式中自动登录的问题？
2、将 fixture 函数名，作为测试用例函数的参数。当使用第2种，事实上也应该写上第一种，只不过是可以省略不写'''